// #include <pthread.h>
// #include <unistd.h>
// #include <stdio.h>
// #include <sys/time.h>

// /*分线程要执行的函数*/
// void* sqr_func(void* arg){
//     static int result;
//     int num=*(int*)arg;
//     result=num*num;
//     sleep(1);
//     return &result;
// }

// int main(void){
//     pthread_t pts[5];
//     int item[5]={1,2,3,4,5};
//     int sqr[5];
//     int sum_all=0;

//     struct timeval tv_start,tv_end;
//     gettimeofday(&tv_start,NULL);
//     /*创建5个分线程,分别计算5个数的平方*/
//     for(int i=0;i<5;i++){
//         pthread_create(&pts[i],NULL,sqr_func,&item[i]);
//     }

//     /*让5个分线程执行完成*/
//     for(int i=0;i<5;i++){
//         void* result;
//         pthread_join(pts[i],&result);
//         sqr[i]=*(int*)result;
//         printf("sqr[%d]=%d ",i,sqr[i]);
//     }
//     gettimeofday(&tv_end,NULL);
//     printf("计算平方和耗时：%lds\n",tv_end.tv_sec-tv_start.tv_sec);
//     for(int i=0;i<5;i++){
//         sum_all+=sqr[i];
//     }
//     printf("平方和是：%d\n",sum_all);
//     return 0;
// }

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>


// 线程函数：求指定数值的平方并返回给主线程
void *calc_sqr_thread_fun(void *arg)
{
    int num = *(int *)arg;
    int * result = malloc(sizeof(int)); /*使用static时，都是在同一块内存中保存结果，导致最后一次计算结果会覆盖前面的结果，就全是25,*/
    *result = num * num;

    sleep(1);
    return result;
}

// 对一个数组中的数分别求平方然后再汇总求和
int main(int argc, char const *argv[])
{
    int items[5] = {1, 2, 3, 4, 5};
    int sqrs[5];

    struct timeval start_t, end_t;
    gettimeofday(&start_t, NULL);

    // 启动5个线程分别计算items中每个数的平方
    pthread_t pts[5];
    for (int i = 0; i < 5; i++)
    {
        pthread_create(&pts[i], NULL, calc_sqr_thread_fun, &items[i]);
    }

    // 等待所有线程执行完毕，将每个线程的返回值保存到sqrs数组中
    for (int i = 0; i < 5; i++)
    {
        void *result;
        if(pthread_join(pts[i], &result)==0){
            printf("thread OK\n");
        }
        sqrs[i] = *(int *)result;
        printf("sqr[%d]=%d ",i,sqrs[i]);
    }

    gettimeofday(&end_t, NULL);
    // 输出计算耗时
    printf("time = %ld秒\n", end_t.tv_sec - start_t.tv_sec);

    // 累加所有的平方值
    int sum = 0;
    for (int i = 0; i < 5; i++)
    {
        sum += sqrs[i];
    }
    printf("sum = %d\n", sum);

    return 0;
}